#!/usr/bin/python3
# -*- encoding: utf-8 -*-
"""
@File    : custom_exception.py
@Time    : 2022/6/1 18:16
@Author  : YangXin
@License : Copyright(C) 2022 忆享科技 All rights reserved
@Desc    :
"""
from django.conf import settings
from django.http import JsonResponse, Http404
from rest_framework import exceptions


def custom_exception_handler(exc, context):
    """
    自定义错误处理方式
    """
    # 专门处理 404 异常，直接返回前端，前端处理
    if isinstance(exc, Http404):
        return JsonResponse(_error("404", str(exc)))

    # 特殊处理 rest_framework ValidationError
    if isinstance(exc, exceptions.ValidationError):
        message = str(exc)
        return JsonResponse(_error("{}".format(exc.status_code), message))

    # 处理 rest_framework 的异常
    if isinstance(exc, exceptions.APIException):
        return JsonResponse(_error("{}".format(exc.status_code), exc.detail))

    # 处理 Data APP 自定义异常
    if isinstance(exc, BaseException):
        _msg = str(exc)
        return JsonResponse(_error(message=_msg))

    # 判断是否在debug模式中,
    # 在这里判断是防止阻止了用户原本主动抛出的异常
    if settings.DEBUG:
        return None

    # 非预期异常
    return JsonResponse(_error("500", "系统错误，请联系管理员"))


def _error(code=400, message="error", data={}, errors="errors"):
    message = f"{message}（{code}）"
    if errors:
        message += f"（detail => {errors}）"
    return {
        "result": False,
        "code": code,
        "data": data,
        "message": message,
        "errors": errors,
    }